gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/SkinControls/SkinComboBox.cpp

    
#include "stdafx.h"
#include "SkinComboBox.h"


IMPLEMENT_DYNAMIC(CSkinComboBox, CComboBox)

BEGIN_MESSAGE_MAP(CSkinComboBox, CComboBox)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
CSkinComboBox::CSkinComboBox()
{
	m_bIsFocus = false;
	m_bLButtonDown = false;
}

CSkinComboBox::~CSkinComboBox()
{
}

void CSkinComboBox::SetComboBtnImage(HRSRC hRes, DWORD imagetype, HMODULE hModule)
{
	m_ImageButton.LoadResource(hRes, imagetype, hModule);
	m_ImageButton.SetTransIndex(0);
	m_ImageButton.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR));
}

void CSkinComboBox::SetComboBtnImage(LPCTSTR pszFileName, DWORD imagetype)
{
	//效验参数
	ASSERT(pszFileName);
	if (pszFileName==NULL) return ;

	//加载位图
	m_ImageButton.Load(pszFileName,imagetype);
	m_ImageButton.SetTransIndex(0);
	m_ImageButton.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR));
}

void CSkinComboBox::SetComboFrameColor(COLORREF crFrameColor)
{
}

void CSkinComboBox::OnPaint() 
{
	CPaintDC dc(this);

	CRect ClientRect;
	GetClientRect(&ClientRect);

	dc.FillSolidRect(&ClientRect, RGB(255,255,255));

	dc.Draw3dRect(&ClientRect, DEF_FRAME_COLOR, DEF_FRAME_COLOR);//边框

	int nBtnWidth = (int)m_ImageButton.GetWidth()/4;
	int nBtnHeight = (int)m_ImageButton.GetHeight();

	int nXPos=(ClientRect.right-nBtnWidth-2);
	int nYPos=ClientRect.Height()/2-nBtnHeight/2;

	if (m_bIsFocus) m_ImageButton.Draw(dc.m_hDC, nXPos, nYPos,nBtnWidth,nBtnHeight, nBtnWidth,0, nBtnWidth,nBtnHeight);
	else if (m_bLButtonDown) m_ImageButton.Draw(dc.m_hDC, nXPos, nYPos,nBtnWidth,nBtnHeight, 0,0,nBtnWidth,nBtnHeight);
	else m_ImageButton.Draw(dc.m_hDC, nXPos, nYPos,nBtnWidth, nBtnHeight, nBtnWidth*2,0,nBtnWidth,nBtnHeight);


	//绘画字体
	CString strText;
	GetWindowText(strText);
	CFont font;
	font.CreateFont(-12,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("宋体"));
	dc.SelectObject(&font);
	dc.SetBkMode(TRANSPARENT);
	ClientRect.left+=3;
	dc.DrawText(strText,&ClientRect,DT_VCENTER | DT_SINGLELINE);
}

//鼠标移动消息
void CSkinComboBox::OnMouseMove(UINT nFlags, CPoint point)
{
	if (m_bIsFocus==false)
	{
		//注册消息
		m_bIsFocus=true;
		Invalidate(FALSE);
		TRACKMOUSEEVENT TrackMouseEvent;
		TrackMouseEvent.cbSize=sizeof(TrackMouseEvent);
		TrackMouseEvent.dwFlags=TME_LEAVE;
		TrackMouseEvent.hwndTrack=GetSafeHwnd();
		TrackMouseEvent.dwHoverTime=HOVER_DEFAULT;
		_TrackMouseEvent(&TrackMouseEvent);
	}

	__super::OnMouseMove(nFlags, point);
}

//鼠标离开消息
LRESULT CSkinComboBox::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
	m_bIsFocus=false;
	Invalidate(FALSE);
	return 0;
}


//绘画背景
BOOL CSkinComboBox::OnEraseBkgnd(CDC * pDC)
{
	return TRUE;
}

void CSkinComboBox::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_bLButtonDown = true;
	m_bIsFocus = false;

	__super::OnLButtonDown(nFlags, point);
}

void CSkinComboBox::OnLButtonUp(UINT nFlags, CPoint point)
{
	m_bLButtonDown = false;
	m_bIsFocus = true;
	__super::OnLButtonUp(nFlags, point);
}